/* zutil.h -- internal interface and configuration of the compression library
 * Copyright (C) 1995-2002 Jean-loup Gailly.
 * For conditions of distribution and use, see copyright notice in zlib.h
 */

/* WARNING: this file should *not* be used by applications. It is
   part of the implementation of the compression library and is
   subject to change. Applications should only use zlib.h.
 */

/* @(#) $Id$ */

#ifndef _Z_UTIL_H
#define _Z_UTIL_H

#include "zlib.h"

#ifdef STDC
    #include <stddef.h>
    #include <string.h>
    #include <stdlib.h>
#endif
#ifdef NO_ERRNO_H
extern int errno;
#else
    #include <errno.h>
#endif

#ifndef local
    #define local static
#endif
/* compile with -Dlocal if your debugger can't find static symbols */

typedef unsigned char uch;
typedef uch FAR uchf;
typedef unsigned short ush;
typedef ush FAR ushf;
typedef unsigned long ulg;


#define ERR_RETURN(strm, err) \
    return (strm->msg = (char*)ERR_MSG(err), (err))
/* To be used only when the state is known to be valid */

/* common constants */

#ifndef DEF_WBITS
    #define DEF_WBITS MAX_WBITS
#endif
/* default windowBits for decompression. MAX_WBITS is for compression only */

#if MAX_MEM_LEVEL >= 8
    #define DEF_MEM_LEVEL 8
#else
    #define DEF_MEM_LEVEL MAX_MEM_LEVEL
#endif
/* default memLevel */

#define STORED_BLOCK 0
#define STATIC_TREES 1
#define DYN_TREES 2
/* The three kinds of block type */

#define MIN_MATCH 3
#define MAX_MATCH 258
/* The minimum and maximum match lengths */

#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */

/* target dependencies */

#ifdef MSDOS
    #define OS_CODE 0x00
    #if defined (__TURBOC__) || defined (__BORLANDC__)
        #if (__STDC__ == 1) && (defined (__LARGE__) || defined (__COMPACT__))
/* Allow compilation with ANSI keywords only enabled */
void _Cdecl farfree(void* block);
void* _Cdecl farmalloc(unsigned long nbytes);
        #else
            #include <alloc.h>
        #endif
    #else /* MSC or DJGPP */
    #endif
#endif

#ifdef OS2
    #define OS_CODE 0x06
#endif

#ifdef WIN32 /* Window 95 & Windows NT */
    #define OS_CODE 0x0b
#endif

#if defined (VAXC) || defined (VMS)
    #define OS_CODE 0x02
    #define F_OPEN(name, mode) \
    ft_fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
#endif

#ifdef AMIGA
    #define OS_CODE 0x01
#endif

#if defined (ATARI) || defined (atarist)
    #define OS_CODE 0x05
#endif

#if defined (MACOS) || defined (TARGET_OS_MAC)
    #define OS_CODE 0x07
    #if defined (__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
        #include <unix.h> /* for fdopen */
    #else
        #ifndef fdopen
            #define fdopen(fd, mode) NULL /* No fdopen() */
        #endif
    #endif
#endif

#ifdef __50SERIES /* Prime/PRIMOS */
    #define OS_CODE 0x0F
#endif

#ifdef TOPS20
    #define OS_CODE 0x0a
#endif

#if defined (_BEOS_) || defined (RISCOS)
    #define fdopen(fd, mode) NULL /* No fdopen() */
#endif

#if (defined (_MSC_VER) && (_MSC_VER > 600))
    #define fdopen(fd, type)  _fdopen(fd, type)
#endif


/* Common defaults */

#ifndef OS_CODE
    #define OS_CODE 0x03 /* assume Unix */
#endif

#ifndef F_OPEN
    #define F_OPEN(name, mode) ft_fopen((name), (mode))
#endif

/* functions */

#ifdef HAVE_STRERROR
extern char* strerror OF((int));
    #define zstrerror(errnum) strerror(errnum)
#else
    #define zstrerror(errnum) ""
#endif

#if defined (pyr)
    #define NO_MEMCPY
#endif
#if defined (SMALL_MEDIUM) && !defined (_MSC_VER) && !defined (__SC__)
/* Use our own functions for small and medium model with MSC <= 5.0.
 * You may have to use the same strategy for Borland C (untested).
 * The __SC__ check is for Symantec.
 */
    #define NO_MEMCPY
#endif
#if defined (STDC) && !defined (HAVE_MEMCPY) && !defined (NO_MEMCPY)
    #define HAVE_MEMCPY
#endif
#ifdef HAVE_MEMCPY
    #ifdef SMALL_MEDIUM /* MSDOS small or medium model */
        #define zmemcpy _fmemcpy
        #define zmemcmp _fmemcmp
        #define zmemzero(dest, len) _fmemset(dest, 0, len)
    #else
        #define zmemcpy ft_memcpy
        #define zmemcmp ft_memcmp
        #define zmemzero(dest, len) ft_memset(dest, 0, len)
    #endif
#else
extern void zmemcpy OF((Bytef * dest, const Bytef * source, uInt len));
extern int zmemcmp OF((const Bytef * s1, const Bytef * s2, uInt len));
extern void zmemzero OF((Bytef * dest, uInt len));
#endif

/* Diagnostic functions */
#ifdef DEBUG
    #include <stdio.h>
extern int z_verbose;
extern void z_error OF((char* m));
    #define Assert(cond, msg) { if (!(cond)) z_error(msg);}
    #define Trace(x) { if (z_verbose >= 0) fprintf x;}
    #define Tracev(x) { if (z_verbose > 0) fprintf x;}
    #define Tracevv(x) { if (z_verbose > 1) fprintf x;}
    #define Tracec(c, x) { if (z_verbose > 0 && (c)) fprintf x;}
    #define Tracecv(c, x) { if (z_verbose > 1 && (c)) fprintf x;}
#else
    #define Assert(cond, msg)
    #define Trace(x)
    #define Tracev(x)
    #define Tracevv(x)
    #define Tracec(c, x)
    #define Tracecv(c, x)
#endif


typedef uLong (*check_func) OF ((uLong check, const Bytef * buf,
                                 uInt len));
local voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size));
local void zcfree OF((voidpf opaque, voidpf ptr));

#define ZALLOC(strm, items, size) \
    (*((strm)->zalloc))((strm)->opaque, (items), (size))
#define ZFREE(strm, addr)  (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
#define TRY_FREE(s, p) { if (p) ZFREE(s, p);}

#endif /* _Z_UTIL_H */